from D5Core.Details import D5
from D5Core.Details.D5Api import D5Api,APIRequestType,APIEvent
from D5Core.D5Common import *
import json
from D5Core.D5Models.Details.D5ModelBase import D5Model





class D5Light(D5Model):
    """
    D5Light 类是D5中所有光源的基类，提供了光源的基本属性和操作方法。
    
    这个类继承自 D5Model，扩展了与光源相关的特定属性和功能。
    
    Attributes:
        open_specular_scale (bool): 是否开启高光缩放
        specular_scale (float): 高光缩放比例
        use_color_temp (bool): 是否使用色温
        light_color (LinarColor): 光源颜色
        color_temperature (float): 色温值
        intensity (float): 光照强度
        intensity_unit (int): 光照强度单位
        attenuation_radius (float): 衰减半径
        turn_on (bool): 光源是否开启
        caustics_enable (float): 焦散效果是否启用
        caustics_softness (float): 焦散效果柔和度
        caustics_strength (float): 焦散效果强度
        light_shape (bool): 光源形状设置
        light_type (str): 光源类型
        undo_light (str): 撤销光源操作
    """
    _attrs = {
        'open_specular_scale': {
            'from': lambda x: x.lower() == 'true' if isinstance(x, str) else bool(x),
            'to': lambda x: str(x).lower(),
            'default': False
        },
        'specular_scale': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'use_color_temp': {
            'from': lambda x: x.lower() == 'true' if isinstance(x, str) else bool(x),
            'to': lambda x: str(x).lower(),
            'default': False
        },
        'light_color': {
            'from': LinearColor.from_str,
            'to': LinearColor.to_str,
            'default': '0,0,0,0'
        },
        'color_temperature': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'intensity': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'intensity_unit': {
            'from': int,
            'to': str,
            'default': 1
        },
        'attenuation_radius': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'turn_on': {
            'from': lambda x: x.lower() == 'true' if isinstance(x, str) else bool(x),
            'to': lambda x: str(x).lower(),
            'default': False
        },
        'caustics_enable': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'caustics_softness': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'caustics_strength': {
            'from': float,
            'to': str,
            'default': 0.0
        },
        'light_shape': {
            'from': lambda x: x.lower() == 'true' if isinstance(x, str) else bool(x),
            'to': lambda x: str(x).lower(),
            'default': False
        },
        'light_type': {
            'from': str,
            'to': str,
            'default': ""
        },
        'undo_light': {
            'from': str,
            'to': str,
            'default': ""
        }
    }
    def __init__(self,dict_data):
        """
        初始化光源实例。
        
        :param dict_data: 包含光源属性的字典数据
        :type dict_data: dict
        """
        # 调用父类的初始化方法，传递字典数据
        super().__init__(dict_data)
    
    @staticmethod
    def create_light(type:LightType,locations:list[Vector3],ground:str=""):
        """
        创建一个新的光源。
        
        :param type: 要创建的光源类型
        :type type: LightType
        :param locations: 光源的位置坐标列表
        :type locations: list[Vector3]
        :param ground: 光源放置的地面标识，默认为空字符串
        :type ground: str
        :return: API请求的响应结果
        """
        d5api = D5Api()
        req_id = d5api.generate_uuid()
        
        # Convert locations to a properly formatted JSON array
        location_strings = [loc.to_str() for loc in locations]
        
        content_dict = {
            "Type": type.value,
            "Locations": location_strings,
            "Ground": ground
        }
        
        payload = {
            "uuid": req_id,
            "type": APIRequestType.CREATE_LIGHT.value,
            "content": json.dumps(content_dict)
        }
        
        res =  d5api.request_sync(req_id, json.dumps(payload))
        model_datas = []
        content = json.loads(res).get("content", "{}")
        actor_ids = json.loads(content).get("ActorIds", [])
        for id in actor_ids:
            model_data =  D5Api().get_model_data(id)
            model_datas.append(model_data)
        return model_datas
    
    def get_light_color(self)->LinearColor:
        """
        获取光源颜色。
        
        :return: 光源的颜色
        :rtype: LinarColor
        """
        ...
        
    def set_light_color(self,color:LinearColor,event: str = APIEvent.NOW)->bool:
        """
        设置光源颜色。
        
        :param color: 新的光源颜色
        :type color: LinarColor
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...

    def get_use_color_temp(self)->bool:
        """
        获取是否使用色温。
        
        :return: 是否使用色温
        :rtype: bool
        """
        ...
        
    def set_use_color_temp(self,use_color_temp:bool,event: str = APIEvent.NOW)->bool:
        """
        设置是否使用色温。
        
        :param use_color_temp: 是否使用色温
        :type use_color_temp: bool
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...

    def get_color_temperature(self)->float:
        """
        获取光源色温值。
        
        :return: 光源的色温值
        :rtype: float
        """
        ...
        
    def set_color_temperature(self,value:float,event: str = APIEvent.NOW)->bool:
        """
        设置光源色温值。
        
        :param value: 新的色温值
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_intensity(self)->float:
        """
        获取光照强度。
        
        :return: 光照的强度值
        :rtype: float
        """
        ...
        
    def set_intensity(self,value:float,event: str = APIEvent.NOW)->bool:
        """
        设置光照强度。
        
        :param value: 新的光照强度值
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_attenuation_radius(self)->float:
        """
        获取光照衰减半径。
        
        :return: 光照衰减半径值
        :rtype: float
        """
        ...
        
    def set_attenuation_radius(self,value:float,event: str = APIEvent.NOW)->bool:
        """
        设置光照衰减半径。
        
        :param value: 新的衰减半径值
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_turn_on(self)->bool:
        """
        获取光源是否开启。
        
        :return: 光源是否开启
        :rtype: bool
        """
        ...
        
    def set_turn_on(self,value:bool,event: str = APIEvent.NOW)->bool:
        """
        设置光源是否开启。
        
        :param value: 光源开启状态
        :type value: bool
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_open_specular_scale(self) -> bool:
        """
        获取是否开启高光缩放。
        
        :return: 是否开启高光缩放
        :rtype: bool
        """
        ...
    
    def set_open_specular_scale(self, value: bool, event: str = APIEvent.NOW) -> bool:
        """
        设置是否开启高光缩放。
        
        :param value: 是否开启高光缩放
        :type value: bool
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
    
    def get_specular_scale(self) -> float:
        """
        获取高光缩放比例。
        
        :return: 高光缩放比例
        :rtype: float
        """
        ...
    
    def set_specular_scale(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置高光缩放比例。
        
        :param value: 高光缩放比例
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
    
    def get_light_color(self) -> LinearColor:
        """
        获取光源颜色。
        
        :return: 光源的颜色
        :rtype: LinarColor
        """
        ...
        
    def set_light_color(self, color: LinearColor, event: str = APIEvent.NOW) -> bool:
        """
        设置光源颜色。
        
        :param color: 新的光源颜色
        :type color: LinarColor
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...

    def get_use_color_temp(self) -> bool:
        """
        获取是否使用色温。
        
        :return: 是否使用色温
        :rtype: bool
        """
        ...
        
    def set_use_color_temp(self, use_color_temp: bool, event: str = APIEvent.NOW) -> bool:
        """
        设置是否使用色温。
        
        :param use_color_temp: 是否使用色温
        :type use_color_temp: bool
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...

    def get_color_temperature(self) -> float:
        """
        获取光源色温值。
        
        :return: 光源的色温值
        :rtype: float
        """
        ...
        
    def set_color_temperature(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置光源色温值。
        
        :param value: 新的色温值
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_intensity(self) -> float:
        """
        获取光照强度。
        
        :return: 光照的强度值
        :rtype: float
        """
        ...
        
    def set_intensity(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置光照强度。
        
        :param value: 新的光照强度值
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_intensity_unit(self) -> int:
        """
        获取光照强度单位。
        
        :return: 光照强度单位
        :rtype: int
        """
        ...
        
    def set_intensity_unit(self, value: int, event: str = APIEvent.NOW) -> bool:
        """
        设置光照强度单位。
        
        :param value: 新的光照强度单位
        :type value: int
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_attenuation_radius(self) -> float:
        """
        获取光照衰减半径。
        
        :return: 光照衰减半径值
        :rtype: float
        """
        ...
        
    def set_attenuation_radius(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置光照衰减半径。
        
        :param value: 新的衰减半径值
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_turn_on(self) -> bool:
        """
        获取光源是否开启。
        
        :return: 光源是否开启
        :rtype: bool
        """
        ...
        
    def set_turn_on(self, value: bool, event: str = APIEvent.NOW) -> bool:
        """
        设置光源是否开启。
        
        :param value: 光源开启状态
        :type value: bool
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_caustics_enable(self) -> float:
        """
        获取焦散效果是否启用。
        
        :return: 焦散效果启用状态
        :rtype: float
        """
        ...
        
    def set_caustics_enable(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置焦散效果是否启用。
        
        :param value: 焦散效果启用状态
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_caustics_softness(self) -> float:
        """
        获取焦散效果柔和度。
        
        :return: 焦散效果柔和度
        :rtype: float
        """
        ...
        
    def set_caustics_softness(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置焦散效果柔和度。
        
        :param value: 新的焦散效果柔和度
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_caustics_strength(self) -> float:
        """
        获取焦散效果强度。
        
        :return: 焦散效果强度
        :rtype: float
        """
        ...
        
    def set_caustics_strength(self, value: float, event: str = APIEvent.NOW) -> bool:
        """
        设置焦散效果强度。
        
        :param value: 新的焦散效果强度
        :type value: float
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_light_shape(self) -> bool:
        """
        获取光源形状设置。
        
        :return: 光源形状设置
        :rtype: bool
        """
        ...
        
    def set_light_shape(self, value: bool, event: str = APIEvent.NOW) -> bool:
        """
        设置光源形状。
        
        :param value: 新的光源形状设置
        :type value: bool
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_light_type(self) -> str:
        """
        获取光源类型。
        
        :return: 光源类型
        :rtype: str
        """
        ...
        
    def set_light_type(self, value: str, event: str = APIEvent.NOW) -> bool:
        """
        设置光源类型。
        
        :param value: 新的光源类型
        :type value: str
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...
        
    def get_undo_light(self) -> str:
        """
        获取撤销光源操作信息。
        
        :return: 撤销光源操作信息
        :rtype: str
        """
        ...
        
    def set_undo_light(self, value: str, event: str = APIEvent.NOW) -> bool:
        """
        设置撤销光源操作信息。
        
        :param value: 新的撤销光源操作信息
        :type value: str
        :param event: 事件类型，默认为立即执行
        :type event: str
        :return: 操作是否成功
        :rtype: bool
        """
        ...

# 更新D5Light的属性字典，包含父类和子类的所有属性
D5Light._attrs = {**D5Model._attrs, **D5Light._attrs}
# 在类定义结束后调用_generate_methods方法
D5Light._generate_methods()







